package com.telecom.controller.user;

import com.telecom.common.context.UserContext;
import com.telecom.common.convention.result.Result;
import com.telecom.pojo.dto.user.user.UserLoginRequestDTO;
import com.telecom.pojo.dto.user.user.UserUpdateRequestDTO;
import com.telecom.pojo.dto.user.user.UserChangePasswordRequestDTO;
import com.telecom.pojo.vo.user.user.UserLoginResponseVO;
import com.telecom.pojo.vo.user.user.UserInfoVO;
import com.telecom.service.UserService;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;

/**
 * 用户个人相关接口
 */
@RestController
@RequestMapping("/user/person")
@Slf4j
public class UserController {

    @Resource
    UserService userService;

    /**
     * 用户登录
     * 
     * @param loginRequest 登录请求参数
     * @return 登录成功返回token
     */
    @PostMapping("/login")
    public Result<UserLoginResponseVO> login(@RequestBody @Valid UserLoginRequestDTO loginRequest) {
        UserLoginResponseVO response = userService.login(loginRequest);
        return Result.success(response);
    }

    /**
     * 用户退出登录
     * 
     * @return 退出结果
     */
    @PostMapping("/logout")
    public Result<Void> logout() {
        return Result.success();
    }

    /**
     * 查询个人信息
     * 
     * @return 用户个人信息
     */
    @GetMapping
    public Result<UserInfoVO> getUserInfo() {
        Long userId = UserContext.getUser();
        UserInfoVO userInfo = userService.getUserInfo(userId);
        return Result.success(userInfo);
    }

    /**
     * 修改个人信息
     * 
     * @param updateRequest 更新信息请求参数
     * @return 更新结果
     */
    @PutMapping
    public Result<Void> updateUserInfo(@RequestBody @Valid UserUpdateRequestDTO updateRequest) {
        userService.updateUserInfo(updateRequest);
        return Result.success();
    }

    /**
     * 修改密码
     * 
     * @param changePasswordRequest 修改密码请求参数
     * @return 修改结果
     */
    @PutMapping("/password")
    public Result<Void> changePassword(@RequestBody @Valid UserChangePasswordRequestDTO changePasswordRequest) {
        userService.changePassword(changePasswordRequest);
        return Result.success();
    }

}
